<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
    *类中的构造器不是必须要写的，要对实例进行初始化操作的时候，如指定属性时才写
    *如果A类继承了B类，且A类中写了构造函数，那么A类中的构造器函数中super()必须要写
    *类中定义的方法放在了类的原型对象上，供类的实例使用
    * */
    // 创建一个类
    class Person {
        constructor(name, age) {
            // 实例属性 (构造器中的this指向类的实例对象)
            this.name = name
            this.age = age
        }

        // 实例方法(放在类的原型对象上，给实例使用,其this指向调用者)
        speak() {
            console.log(`我叫${this.name},我的年龄是${this.age}`)
        }
    }

    // 创建一个Person的实例对象
    const p1 = new Person("马云", 55)
    const p2 = new Person("马化腾", 50)
    console.log(p1)
    console.log(p2)
    p1.speak()
    p2.speak()


    //创建一个Student类继承Person类
    class Student extends Person {
        constructor(name, age, grade) {
            super(name, age)
            this.grade = grade
        }

        // 重写父类的实例方法
        speak() {
            console.log(`我叫${this.name},我的年龄是${this.age},我读的是${this.grade}`)
        }

        // 实例方法(放在类的原型对象上，给实例使用,其this指向调用者)
        study() {
            console.log(`我叫${this.name}我在学习`)
        }
    }

    // 创建一个Student的实例对象
    const s1 = new Student("张三", 16, "高一")
    const s2 = new Student("李四", 18, "高二")
    console.log(s1)
    console.log(s2)
    s1.speak()
    s2.speak()
    s1.study()
    s2.study()


    // 创建一个Car类
    class Car {
        constructor(name, price) {
            this.name = name
            this.price = price
        }
        // 类中可以直接写赋值语句，如下代码的含义是给Car实例对象添加一个属性key为a value为1
        a = 4
    }
    // 创建一个Car类的实例对象
    const c=new Car("宝马x5",15)
    console.log(c)
</script>
</body>
</html>